Spring Cloud Feign একটি declarative REST client যা মাইক্রোসার্ভিসগুলির মধ্যে যোগাযোগকে অনেক সহজ এবং স্বচ্ছন্দ করে তোলে। Feign ক্লায়েন্ট তৈরি করার মাধ্যমে, আপনি REST API কলগুলোকে সহজে ডিফাইন করতে পারেন এবং স্প্রিং ক্লাউড অ্যাপ্লিকেশনগুলির মধ্যে কম্প্লেক্স HTTP কলের জন্য কোড কমাতে পারেন। এটি Spring Cloud এর সাথে একটি Declarative Web Service Client হিসেবে কাজ করে, যার মাধ্যমে RESTful ওয়েব সার্ভিসের কলগুলোকে ইন্টারফেসের মাধ্যমে ডিফাইন করা যায়।
@RequestMapping
, @GetMapping
, @PostMapping
ইত্যাদি স্প্রিং অ্যানোটেশন ব্যবহার করে তৈরি করা হয়।প্রথমে, pom.xml
ফাইলে Spring Cloud Feign এর ডিপেনডেন্সি যোগ করতে হবে।
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
এটি Feign
এর জন্য স্প্রিং ক্লাউড এর প্রয়োজনীয় লাইব্রেরি যোগ করবে।
এটি আপনার স্প্রিং বুট অ্যাপ্লিকেশনকে Feign ক্লায়েন্টস ব্যবহারের জন্য সক্ষম করে।
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class FeignClientApplication {
public static void main(String[] args) {
SpringApplication.run(FeignClientApplication.class, args);
}
}
@EnableFeignClients
অ্যানোটেশনটি স্প্রিং বুট অ্যাপ্লিকেশনকে জানায় যে এটি Feign ক্লায়েন্ট ব্যবহার করবে এবং ক্লায়েন্টের জন্য যে সমস্ত @FeignClient
রয়েছে তা সনাক্ত করবে।
Feign ক্লায়েন্ট তৈরি করতে, আপনাকে একটি ইন্টারফেস তৈরি করতে হবে এবং @FeignClient
অ্যানোটেশন ব্যবহার করতে হবে। এই অ্যানোটেশনটি ক্লায়েন্ট সার্ভিসের নাম বা URL নির্দেশ করবে এবং REST API এর জন্য মেথড ডিফাইন করবে।
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "jsonplaceholder", url = "https://jsonplaceholder.typicode.com")
public interface PostClient {
@GetMapping("/posts/1")
String getPost();
}
এখানে, @FeignClient
ক্লায়েন্টের নাম এবং URL সেট করা হয়েছে। এই ক্লায়েন্টটি https://jsonplaceholder.typicode.com/posts/1
এর এন্ডপয়েন্টে GET রিকোয়েস্ট পাঠাবে।
এখন আপনি এই Feign Client
ইন্টারফেসটি স্প্রিং বিউট অ্যাপ্লিকেশনের মধ্যে ব্যবহার করতে পারেন। এটি একটি স্বয়ংক্রিয় HTTP কল তৈরি করবে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PostController {
@Autowired
private PostClient postClient;
@GetMapping("/post")
public String getPost() {
return postClient.getPost(); // Feign ক্লায়েন্টের মাধ্যমে পোস্ট ডেটা রিটার্ন
}
}
এখানে, PostClient
ব্যবহার করে getPost
মেথডের মাধ্যমে FeignClient
সার্ভিস থেকে ডেটা রিটার্ন করা হচ্ছে।
যদি প্রয়োজন হয়, তবে Feign ক্লায়েন্টের জন্য কাস্টম কনফিগারেশন সেট করা যেতে পারে, যেমন টাইমআউট, ইন্টারসেপ্টর ইত্যাদি।
import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
public RequestInterceptor requestInterceptor() {
return requestTemplate -> {
requestTemplate.header("Authorization", "Bearer " + "your-token");
};
}
}
এটি Authorization Header যুক্ত করার জন্য একটি RequestInterceptor তৈরি করবে, যা Feign এর রিকোয়েস্টে যুক্ত হবে।
Feign এর সাথে error handling করা গুরুত্বপূর্ণ। আপনি বিভিন্ন HTTP স্টেটাস কোডের জন্য কাস্টম এক্সসেপশন হ্যান্ডলিংও করতে পারেন।
import feign.Response;
import feign.codec.ErrorDecoder;
public class CustomErrorDecoder implements ErrorDecoder {
@Override
public Exception decode(String methodKey, Response response) {
if (response.status() == 404) {
return new RuntimeException("Resource not found");
}
return new Exception("Generic error");
}
}
এটি Feign
এর সাথে কাস্টম error decoder সেটআপ করার একটি উদাহরণ।
Feign
ক্লায়েন্ট Ribbon এর সাথে ইন্টিগ্রেট করা যায়। এটি সার্ভিস ডিসকভারি (যেমন Eureka) ব্যবহার করে বিভিন্ন সার্ভিসের মধ্যে রিকোয়েস্টের লোড ব্যালেন্স করতে সাহায্য করে।
@FeignClient(name = "my-service", configuration = FeignConfig.class)
public interface MyServiceClient {
@GetMapping("/some-endpoint")
String getData();
}
এখানে, @FeignClient
এর name
অ্যাট্রিবিউটটি সার্ভিসের নাম হিসেবে ব্যবহৃত হয়, যা Eureka বা Ribbon সার্ভিস ডিসকভারি ব্যবস্থার মধ্যে রেজিস্টার করা থাকবে।
Ribbon
এবং Eureka সহ client-side load balancing সহজভাবে সম্ভব।Spring Cloud Feign হল একটি অত্যন্ত কার্যকর এবং declarative REST client যা মাইক্রোসার্ভিস আর্কিটেকচারের জন্য উন্নত HTTP ক্লায়েন্ট তৈরি করতে সহায়ক। এটি মাইক্রোসার্ভিসগুলির মধ্যে সার্ভিস কল এবং তাদের পারস্পরিক যোগাযোগ ব্যবস্থাকে সহজ এবং পরিষ্কার করে তোলে।
Feign হলো একটি ডেক্লারেটিভ HTTP ক্লায়েন্ট যা মূলত Spring Cloud দ্বারা সহজতর করা হয়েছে। এটি মাইক্রোসার্ভিস আর্কিটেকচারে API কল করার জন্য ব্যবহৃত হয়, যেখানে ক্লায়েন্ট সার্ভিসগুলি অন্যান্য সার্ভিসের API এর সাথে যোগাযোগ করে। Feign HTTP ক্লায়েন্ট তৈরির প্রক্রিয়াটি সহজ এবং পরিষ্কার করে, এবং এটি RESTful API গুলির জন্য সার্ভিস কল তৈরি করতে অনেক সহজ এবং ম্যানেজেবল উপায় প্রদান করে।
Feign আপনাকে সরাসরি HTTP রিকোয়েস্ট তৈরি না করে একটি Java Interface ব্যবহার করে RESTful API কল করতে সাহায্য করে। Feign-এ, আপনি একটি ইন্টারফেস তৈরি করেন এবং সেটির মধ্যে HTTP রিকোয়েস্ট মেথড ডিফাইন করেন, Feign স্বয়ংক্রিয়ভাবে সেই মেথডের জন্য HTTP রিকোয়েস্ট তৈরি করে দেয়।
Jackson
বা Gson
ইন্টিগ্রেশন সমর্থন করে, তাই আপনাকে আলাদাভাবে ডাটা পার্সিং করতে হয় না।Feign একটি Java Interface এর মাধ্যমে HTTP ক্লায়েন্ট তৈরি করে। এখানে একটি উদাহরণ দেখানো হলো:
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "my-service") // Service name in Eureka
public interface MyServiceClient {
@GetMapping("/api/data")
String getData();
}
এই কোডে @FeignClient
অ্যানোটেশন ব্যবহার করা হয়েছে, যা Feign কে জানায় যে এটি একটি ক্লায়েন্ট ইন্টারফেস এবং এটি my-service
নামক সার্ভিসের সাথে যোগাযোগ করবে। @GetMapping("/api/data")
রিকোয়েস্টটি my-service
API এর /api/data
এন্ডপয়েন্টে পাঠানো হবে।
Feign ক্লায়েন্টকে Spring Boot Application এ ব্যবহার করা যায়। আপনাকে শুধু @EnableFeignClients অ্যানোটেশন দিয়ে এটি সক্রিয় করতে হবে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@Autowired
private MyServiceClient myServiceClient;
public String getDataFromService() {
return myServiceClient.getData();
}
}
application.yml ফাইলে Feign ক্লায়েন্টের কনফিগারেশন সংযুক্ত করতে হবে।
spring:
application:
name: my-client-service
cloud:
discovery:
enabled: true # Eureka Discovery enabled for Feign Client
Feign ব্যবহার করে Hystrix এবং Circuit Breaker সেটআপ করা যায়, যাতে সার্ভিস কল ব্যর্থ হলে একটি ডিফল্ট ফাংশন (ফলব্যাক) কাজ করে।
@FeignClient(name = "my-service", fallback = MyServiceFallback.class)
public interface MyServiceClient {
@GetMapping("/api/data")
String getData();
}
@Component
public class MyServiceFallback implements MyServiceClient {
@Override
public String getData() {
return "Fallback data";
}
}
এখানে, যদি my-service
সার্ভিস ডাউন বা অনুপস্থিত থাকে, তাহলে MyServiceFallback ক্লাসের getData()
মেথডটি কল করা হবে এবং "Fallback data" রিটার্ন করবে।
Feign হলো একটি শক্তিশালী ডেক্লারেটিভ HTTP ক্লায়েন্ট যা মাইক্রোসার্ভিস অ্যাপ্লিকেশনের মধ্যে সহজভাবে সার্ভিস কল করতে ব্যবহৃত হয়। এটি সার্ভিস ডিস্কভারি, লোড ব্যালেন্সিং, এবং ফলব্যাক ফাংশনালিটি সহ বিভিন্ন সুবিধা প্রদান করে, যা RESTful API কলকে দ্রুত এবং নির্ভরযোগ্য করে তোলে। Feign এর মাধ্যমে API কলের জন্য অনেক কম কোড লিখে আরও কার্যকরী এবং পরিষ্কার কোড লেখা যায়, যা মাইক্রোসার্ভিস আর্কিটেকচারের জন্য উপযুক্ত।
Spring Cloud Feign Client হল একটি declarative HTTP client, যা Spring Cloud দ্বারা ব্যবহৃত হয় মাইক্রোসার্ভিসে HTTP রিকোয়েস্ট করার জন্য। Feign সহজে HTTP ক্লায়েন্ট কল করার একটি উপায় প্রদান করে, এবং এটি Spring Boot-এর সাথে ইন্টিগ্রেট করা খুবই সহজ। Feign Client অ্যাপ্লিকেশনগুলি একে অপরের সাথে যোগাযোগ করার জন্য ব্যবহার করা হয়, যেমন মাইক্রোসার্ভিসের মধ্যে।
Feign Client কাজ করার জন্য আপনাকে কিছু ডিপেনডেন্সি আপনার pom.xml
ফাইলে যোগ করতে হবে।
<dependencies>
<!-- Spring Boot Starter Web for REST API -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Cloud Feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- Spring Boot Starter Test for testing -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
এখানে, spring-cloud-starter-openfeign
ফিচারটি Feign Client-এর জন্য মূল ডিপেনডেন্সি।
Spring Boot অ্যাপ্লিকেশন থেকে Feign Client ব্যবহার করতে, আপনাকে @EnableFeignClients
এনোটেশন ব্যবহার করতে হবে।
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class FeignClientApplication {
public static void main(String[] args) {
SpringApplication.run(FeignClientApplication.class, args);
}
}
এখানে, @EnableFeignClients
এনোটেশন Spring Boot অ্যাপ্লিকেশনকে Feign ক্লায়েন্ট ব্যবহার করার অনুমতি দেয়।
Feign Client একটি ইন্টারফেস হিসেবে কাজ করে, যা API রিকোয়েস্টের জন্য HTTP মেথডগুলো ডিফাইন করে।
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(name = "user-service", url = "http://localhost:8081")
public interface UserClient {
@GetMapping("/users/{id}")
String getUserById(@PathVariable("id") Long id);
}
এখানে:
@FeignClient
এনোটেশনটি Feign Client ইন্টারফেসকে একটি HTTP ক্লায়েন্টে রূপান্তরিত করে, যা user-service
নামক সার্ভিসের API এ যোগাযোগ করে।url
প্রপার্টি দিয়ে user-service
এর URL বা সার্ভিস পাথ উল্লেখ করা হয়।@GetMapping
বা অন্যান্য HTTP মেথডের (POST, PUT, DELETE ইত্যাদি) সাহায্যে রিকোয়েস্ট পাথ নির্ধারণ করা হয়।Feign Client তৈরি করার পর, আপনি এটি আপনার সার্ভিসে ব্যবহার করতে পারেন।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserClient userClient;
@Autowired
public UserService(UserClient userClient) {
this.userClient = userClient;
}
public String getUserDetails(Long id) {
return userClient.getUserById(id); // Feign Client কল
}
}
এখানে, UserClient
ইনজেক্ট করা হয়েছে এবং এটি ব্যবহার করে getUserById
মেথড কল করা হচ্ছে।
আপনি Feign Client কনফিগার করতে পারেন, যেমন কাস্টম টাইমআউট, লোড ব্যালেন্সিং এবং অন্যান্য অপশন।
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL; // Log complete details
}
}
এখানে, Logger.Level.FULL
ব্যবহার করে Feign-এর লগিং ডিটেইলস সম্পূর্ণ করা হয়েছে। আপনি আরও বিভিন্ন কনফিগারেশন যেমন টাইমআউট, রিট্রাই পলিসি ইত্যাদি কাস্টমাইজ করতে পারেন।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import feign.Request;
import java.util.concurrent.TimeUnit;
@Configuration
public class FeignConfig {
@Bean
public Request.Options requestOptions() {
return new Request.Options(5000, TimeUnit.MILLISECONDS, 10000, TimeUnit.MILLISECONDS, true);
}
}
এখানে, requestOptions()
মেথডে কনফিগারেশন নির্ধারণ করা হয়েছে যাতে connection timeout 5 সেকেন্ড এবং read timeout 10 সেকেন্ড করা হয়েছে।
Feign Client এর জন্য ইউনিট টেস্ট করা খুব সহজ, কারণ এটি সহজেই Mock করা যায়।
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import static org.mockito.Mockito.when;
import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest
public class UserServiceTest {
@MockBean
private UserClient userClient;
@Autowired
private UserService userService;
@Test
public void testGetUserDetails() {
// Mock Feign Client response
when(userClient.getUserById(1L)).thenReturn("User with ID: 1");
// Call service method
String result = userService.getUserDetails(1L);
// Assert the response
assertEquals("User with ID: 1", result);
}
}
এখানে, @MockBean
ব্যবহার করে UserClient
কে মক করা হয়েছে এবং এর রেসপন্স মক করা হয়েছে।
@FeignClient
এনোটেশন ব্যবহার করে মাইক্রোসার্ভিসের মধ্যে HTTP রিকোয়েস্ট পরিচালনা করা যায়।Spring Cloud Feign Client ব্যবহার করে আপনার মাইক্রোসার্ভিসের মধ্যে সহজে যোগাযোগ স্থাপন করতে পারবেন।
Spring Cloud Feign হল একটি declarative HTTP client, যা HTTP API কল করার জন্য খুবই সুবিধাজনক। Feign আপনাকে HTTP ক্লায়েন্ট কোড কম্পাইল করতে সাহায্য করে এবং বিভিন্ন HTTP সার্ভিসের সাথে যোগাযোগ করতে সহজ পদ্ধতি প্রদান করে। Feign এর মাধ্যমে আপনি কাস্টম কনফিগারেশন এবং Error Handling করতে পারেন, যা মাইক্রোসার্ভিসগুলোর মধ্যে নিরাপদ এবং কার্যকরী যোগাযোগের জন্য সহায়ক।
Feign Client-এর জন্য কাস্টম কনফিগারেশন তৈরি করতে হলে, আপনাকে Feign Client এর জন্য কনফিগারেশন ক্লাস তৈরি করতে হবে। এই ক্লাসের মধ্যে আপনি বিভিন্ন কাস্টম timeout, interceptors, এবং error handling কনফিগারেশন করতে পারেন।
import feign.Logger;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.web.client.RestTemplate;
import feign.Feign;
import feign.Request;
import feign.codec.ErrorDecoder;
@Configuration
public class FeignConfig {
// Customize Feign Client timeout
@Bean
public Request.Options options() {
return new Request.Options(5000, 10000); // 5 seconds connection timeout, 10 seconds read timeout
}
// Customize error decoder
@Bean
public ErrorDecoder errorDecoder() {
return new MyErrorDecoder();
}
// Customize Feign logging level
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL; // FULL logging for debugging purposes
}
// Customize Feign client with interceptors
@Bean
public ClientHttpRequestInterceptor interceptor() {
return (request, body, execution) -> {
// Add custom header or any request modification here
request.getHeaders().add("Authorization", "Bearer my-token");
return execution.execute(request, body);
};
}
@Bean
public Feign.Builder feignBuilder() {
return Feign.builder().requestInterceptor(interceptor());
}
}
options()
: Feign এর connection এবং read timeout কাস্টমাইজ করা যায়।errorDecoder()
: কাস্টম error handling ব্যবহার করা হয়।feignLoggerLevel()
: Feign ক্লায়েন্টের লগিং লেভেল সেট করা হয় (e.g., NONE
, BASIC
, HEADERS
, FULL
).interceptor()
: HTTP রিকোয়েস্টের আগে কাস্টম হেডার বা কোনো অতিরিক্ত মডিফিকেশন করতে RequestInterceptor
ব্যবহার করা হয়।Feign Client তৈরি করতে হলে, একটি Interface তৈরি করতে হয় যা HTTP API কলগুলি সরাসরি রেফারেন্স করে।
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(name = "user-service", url = "http://localhost:8080", configuration = FeignConfig.class)
public interface UserServiceClient {
@GetMapping("/users/{id}")
String getUserById(@PathVariable("id") Long id);
}
configuration = FeignConfig.class
ব্যবহার করা হয়েছে যা কাস্টম কনফিগারেশন লোড করতে সহায়ক।Feign এ Error Handling এর জন্য ErrorDecoder ব্যবহার করা হয়। আপনি কাস্টম ErrorDecoder তৈরি করতে পারেন যা Feign সার্ভিস কলের ত্রুটিগুলি হ্যান্ডল করবে।
import feign.Response;
import feign.codec.ErrorDecoder;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
public class MyErrorDecoder implements ErrorDecoder {
@Override
public Exception decode(String methodKey, Response response) {
if (response.status() == HttpStatus.NOT_FOUND.value()) {
// Example: handle 404 error
return new ResourceNotFoundException("Resource not found: " + methodKey);
} else if (response.status() == HttpStatus.BAD_REQUEST.value()) {
// Example: handle 400 error
return new BadRequestException("Bad Request: " + methodKey);
}
return new Exception("Generic error: " + response.status());
}
}
decode()
: এই মেথডে, HTTP রেসপন্স কোডের উপর ভিত্তি করে কাস্টম Exception তৈরি করা হয়। উদাহরণস্বরূপ, যদি 404 Not Found
রেসপন্স আসে, তবে ResourceNotFoundException
থ্রো হবে।@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String message) {
super(message);
}
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
public class BadRequestException extends RuntimeException {
public BadRequestException(String message) {
super(message);
}
}
@ResponseStatus
: এই অ্যানোটেশনটি ব্যবহার করে আপনি কাস্টম HTTP Status যুক্ত করতে পারেন, যাতে ক্লায়েন্ট সঠিক রেসপন্স পায়।Feign Client এর মধ্যে ErrorDecoder এর মাধ্যমে ত্রুটি হ্যান্ডলিং করা যায়। এবার, আমরা আমাদের কাস্টম ErrorDecoder ব্যবহার করে Client এর রেসপন্স হ্যান্ডল করবো।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
private final UserServiceClient userServiceClient;
@Autowired
public UserController(UserServiceClient userServiceClient) {
this.userServiceClient = userServiceClient;
}
@GetMapping("/getUser/{id}")
public String getUser(@PathVariable("id") Long id) {
try {
return userServiceClient.getUserById(id);
} catch (Exception e) {
return "Error occurred: " + e.getMessage();
}
}
}
এখানে UserServiceClient
এর মাধ্যমে API কল করা হচ্ছে এবং যদি কোনো ত্রুটি ঘটে, তবে কাস্টম Exception এর মেসেজ হ্যান্ডল করা হবে।
Logger.Level.FULL
).Feign একটি খুবই শক্তিশালী HTTP ক্লায়েন্ট যা সহজেই মাইক্রোসার্ভিসগুলির মধ্যে যোগাযোগ স্থাপন করতে সাহায্য করে। তবে, সঠিক custom configuration এবং error handling ছাড়া কোনো সিস্টেমের স্থিতিশীলতা বজায় রাখা কঠিন হতে পারে। ErrorDecoder
ব্যবহার করে কাস্টম ত্রুটি হ্যান্ডলিং, কনফিগারেশন টিউনিং, এবং fallback প্যাটার্ন প্রয়োগ করে আপনি আপনার অ্যাপ্লিকেশনকে আরো নিরাপদ এবং কার্যকরী করতে পারেন।
যদি আরো কোনো বিষয় বা কনফিগারেশন নিয়ে সাহায্য দরকার হয়, জানাবেন! 😊
Feign Client স্প্রিং ক্লাউডের একটি ক্লায়েন্ট সাইড HTTP ক্লায়েন্ট, যা RESTful সার্ভিসের সাথে ইন্টারঅ্যাক্ট করতে ব্যবহার করা হয়। এটি স্প্রিং ক্লাউডের অংশ এবং Spring Cloud OpenFeign লাইব্রেরির মাধ্যমে কাজ করে। Feign Client মাইক্রোসার্ভিসগুলির মধ্যে সিম্পল HTTP কল করতে সহজতর করে তোলে, এবং @FeignClient
অ্যানোটেশন ব্যবহারের মাধ্যমে মাইক্রোসার্ভিসের API-কে ইন্টারফেস হিসেবে উপস্থাপন করা হয়।
স্প্রিং ক্লাউড ফেইন ক্লায়েন্ট ব্যবহারের জন্য আমাদের Spring Cloud OpenFeign ডিপেনডেন্সি যুক্ত করতে হয় এবং ফেইন ক্লায়েন্ট ব্যবহার করতে সক্ষম হতে হয়।
pom.xml
(Feign Client):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
স্প্রিং বুট অ্যাপ্লিকেশন কনফিগার করার জন্য @EnableFeignClients
অ্যানোটেশন ব্যবহার করতে হয়। এই অ্যানোটেশন অ্যাপ্লিকেশনে ফেইন ক্লায়েন্ট সক্রিয় করে।
Config Class (Feign Enable):
package com.example.feignclient;
import org.springframework.context.annotation.Configuration;
import org.springframework.cloud.openfeign.EnableFeignClients;
@Configuration
@EnableFeignClients
public class FeignConfig {
}
এখানে @EnableFeignClients
স্প্রিং বুট অ্যাপ্লিকেশনে ফেইন ক্লায়েন্ট সক্রিয় করবে।
Feign ক্লায়েন্ট ব্যবহার করতে একটি ইন্টারফেস তৈরি করতে হয় এবং এই ইন্টারফেসের মেথডগুলিতে HTTP মেথডের জন্য সংশ্লিষ্ট অ্যানোটেশন ব্যবহার করতে হয়, যেমন @GetMapping
, @PostMapping
, ইত্যাদি।
Feign Client Interface:
package com.example.feignclient.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "user-service", url = "http://localhost:8081") // Service Name or URL
public interface UserServiceClient {
@GetMapping("/api/users")
String getUsers();
}
@FeignClient(name = "user-service")
: এই অ্যানোটেশন দ্বারা ফেইন ক্লায়েন্টটি user-service
নামে একটি মাইক্রোসার্ভিসের সাথে ইন্টারঅ্যাক্ট করবে। আপনি সার্ভিসের URL বা সার্ভিস নেম ব্যবহার করতে পারেন।@GetMapping("/api/users")
: এটি GET
রিকোয়েস্টের জন্য, যেটি /api/users
এন্ডপয়েন্টে HTTP GET অনুরোধ করবে।Feign Client কে ইন্সপেক্ট করা যেতে পারে স্প্রিং বুট সার্ভিসে যেমন অন্যান্য ক্লাসের মতো। এখানে UserServiceClient
ব্যবহার করা হবে।
Service Class (Feign Client ব্যবহার করা):
package com.example.feignclient.service;
import com.example.feignclient.client.UserServiceClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserServiceClient userServiceClient;
public String getUsersFromService() {
return userServiceClient.getUsers();
}
}
UserServiceClient
ব্যবহার করে getUsers()
মেথডটি কল করা হয়েছে, যা ফেইন ক্লায়েন্টের মাধ্যমে User Service থেকে ব্যবহারকারীদের ডেটা আনবে।আপনি যেভাবে REST API তৈরি করেন, সেভাবে Feign Client ব্যবহার করে কল করা API-এর রেসপন্স নিয়েও কন্ট্রোলার তৈরি করতে পারবেন।
Controller (Feign Client এর মাধ্যমে API কল করা):
package com.example.feignclient.controller;
import com.example.feignclient.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/fetch-users")
public String fetchUsers() {
return userService.getUsersFromService();
}
}
এখন যখন /fetch-users
এ রিকোয়েস্ট পাঠানো হবে, তখন এটি ফেইন ক্লায়েন্টের মাধ্যমে User Service থেকে ইউজার ডেটা গ্রহণ করবে এবং তা রিটার্ন করবে।
আপনি যদি কোন কনফিগারেশন বা টিউনিং করতে চান, যেমন টাইমআউট, রিট্রাই ফিচার বা লগিং কনফিগারেশন, তা application.yml
অথবা কনফিগারেশন ক্লাসে করতে পারেন।
application.yml
:
feign:
client:
config:
user-service:
connectTimeout: 5000 # কানেকশন টাইমআউট
readTimeout: 5000 # রিড টাইমআউট
এছাড়া, আপনি ফেইন ক্লায়েন্টের জন্য Interceptor, ErrorDecoder, বা Logger সেট করতে পারেন।
GET /api/users
এ একটি ব্যবহারকারী তালিকা প্রদান করবে।এখন http://localhost:8080/fetch-users
এ কল করলে, ফেইন ক্লায়েন্টটি user-service
থেকে ডেটা নিয়ে আসবে।
Service Discovery ব্যবহারের জন্য:
url
ফিল্ডটি সরাতে পারেন এবং শুধু name
দিয়ে সার্ভিস ডিসকভারি করতে পারেন:@FeignClient(name = "user-service")
@FeignClient
অ্যানোটেশন ব্যবহার করে API কল করা যায়, যা কোডিংকে অনেক সহজ করে তোলে।Read more